Jak osadzić obrazy w treści maila używając Microsoft Flow
Table of Contents
Pracując nad moim rozwiązaniem umożliwiającym wysyłanie wiadomości e-mail z informacji tworzonych i przechowywanych w SharePoint doszedłem do wniosku, iż dobrym pomysłem byłoby, aby obrazy w takich e-mailach nie były osadzane w postaci adresu URL prowadzącego do pliku, umieszczonego w bibliotece SharePoint (takie podejście opisałem tutaj), ponieważ w takim rozwiązaniu użytkownik, nie mający dostępu do SharePoint lub nie będący zalogowanym, zwyczajnie tych obrazów nie zobaczy.
Jak osadzić obrazy w treści e-maila?
Istnieją w zasadzie trzy podejścia:
- Atrybut „src” wskazujący absolutny adres URL pliku, przechowywanego na jakimś serwerze;
- Atrybut „src=cid:” (Content-ID) – tzw. wewnętrzne linkowanie w e-mailu, pomiędzy fizycznie dołączonym załącznikiem i jego wystąpieniem w treści, gdzie jest wyświetlany, korzystając z parametru „cid” (źródło);
- Osadzanie obrazu korzystając z ciągu znaków zakodowanych base64 wstawionych jako wartość atrybutu „src=data:image/jpeg;base64,<base64-encoded-image>” (albo png, albo gif), w tym podejściu cały obraz jest po prostu wstawiony do treści wiadomości (źródło).
Ad. 1 – działa wspaniale tak długo, jak użytkownik ma dostęp do pliku…
Ad. 2 – Microsoft Flow aktualnie pozwala na dołączenie tylko jednego pliku. Nie istnieje możliwość wstawienia wielu załączników (można na to głosować tutaj). Także podejście, w którym obrazy są dołączone, a następnie wyświetlane przy użyciu „cid” niestety nie jest zbytnio przydatne.
Ad. 3 – wydawało się dość proste, jednak miałem na uwadze fakt, iż w zasadzie większość klientów poczty elektronicznej nie wspiera wyświetlania obrazów wstawionych jako zakodowane ciągi base64. Ten stary, jednak wciąż na czasie post pokazuje, jak wygląda kwestia wsparcia dla tej metody: https://www.campaignmonitor.com/blog/email-marketing/2013/02/embedded-images-in-html-email/
Podejście z użyciem base64
Z uwagi na największe szanse powodzenia, wybrałem to podejście. Udało mi się je zrealizować w kilku krokach (jest ich więcej, ponieważ Flow nie obsługuje żadnych wyrażeń regularnych. Można na tę funkcję głosować tutaj):
- Najpierw przetwarzam treść maila, by poznać wszystkie adresy URL obrazów. Robię to, używając najpierw akcji „split”, podając jako separator token ’ src=” ’ (tak, wraz z cudzysłowem).
- Następnie, dla każdego elementu z listy sprawdzam, czy bieżący element zaczyna się od ciągu „http”. Jeśli tak, oznacza to, że mam do czynienia z adresem URL obrazu.
- Następnie wyodrębniam adres URL obrazu, korzystając z poniższego wyrażenia (od początku, do zamykającego cudzysłowu):
substring(item(), 0, indexOf(item(), '"'))
- Następnie używam akcji SharePoint do pobrania zawartości pliku korzystając ze ścieżki (rozbita na bezwzględny adres URL do witryny, w której znajduje się obraz i adresu względnego do witryny, dla samego pliku).
- W odpowiedzi otrzymuję obiekt, z którego chcę uzyskać wartość atrybutu „$contents” i następnie zamienić nim wartość atrybutów „src” w treści e-maila. W tym celu korzystam z poniższego wyrażenia:
replace(variables('var_Body_Str'), outputs('Image_Path'), concat('data:image/png;base64,', body('Get_file_content_using_path')?['$content']))
I w zasadzie to wszystko. Podglądając treść maila w trakcie wykonywania się przepływu pracy widziałem poprawnie budowany HTML. Następnie, gdy otworzyłem otrzymaną wiadomość korzystając z Outlook Web Access, obrazki wyświetliły się prawidłowo:
Dzięki za lekturę! A może masz inne pomysły na rozwiązanie tego problemu? Podziel się nimi w komentarzach! 🙂
Reason
Stary post problemy te same.
Właśnie próbuję ogarnąć wysyłkę maili z Power Automate na konta służbowe (O365) ale też na konta zewnętrzne, jak GMAIL, czy O2.
No nie idzie 🙂 Albo CID działa w jednym miejscu a w drugim nie. Base 64 to poza outlookiem chyba nigdzie nie śmiga 😉